package Test.Test01;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 * @version 1.0
 * @BelongsProject:IntelliJ IDEA
 * @BelongsPackage:Test.Test01
 * @Author:hyhWTX
 * @ClassName:Test
 * @CreateTime:2022年-10月-21日 12:40
 * @Description: TODO (一句话描述以下该类的功能)
 */



//哲学家进餐问题
public class Test {
    //创建大小为5的信号量数组，模拟5根筷子
    static Semaphore[] array =new Semaphore[5];
    public static void main(String[] args) {
        //创建一个5个线程的线程池
        ExecutorService es=Executors.newFixedThreadPool(5);

        //初始化信号量
        for(int i=0;i<5;i++){
            array[i]=new Semaphore(1,true);
        }
        //创建5个哲学家 但这样有可能会产生死锁问题
        for(int i=0;i<5;i++){
            es.execute(new ActionRunnable(i));
        }

    }
    //第i+1号哲学家的活动过程
    static class ActionRunnable implements Runnable{
        private int i=0;
        ActionRunnable(int i){
            this.i=i;
        }

        @Override
        public void run() {
            while(!Thread.interrupted()){
                try {
                    if((i+1)%2!=0){
                        //奇数号哲学家
                        //请求左边的筷子
                        array[i].acquire();
                        //请求右边的筷子
                        array[(i+1)%5].acquire();
                    }else{
                        //偶数号哲学家
                        //请求右边的筷子
                        array[(i+1)%5].acquire();
                        //再请求左边的筷子
                        array[i].acquire();
                    }
                    //吃饭
                    System.out.println("我是哲学家"+(i+1)+"号我在吃饭");

                    if((i+1)%2!=0){
                        //奇数号哲学家
                        //释放左手的筷子
                        array[i].release();
                        //释放右手的筷子
                        array[(i+1)%5].release();
                    }else{
                        //偶数号的哲学家
                        array[(i+1)%5].release();
                        array[i].release();
                    }
                    //哲学家开始思考
                    System.out.println("我是哲学家"+(i+1)+"号我吃饱了我放下筷子了！");
                    //通知cpu 将调度权让给其他哲学家线程
                    Thread.yield();
                    //思考1秒
                    //把休眠关闭，造成死锁的概率就会增加
                    //Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }


            }

        }

    }

}